/**
 * 代理对象
 * @param {*} vm 
 * @param {*} obj 
 * @param {*} namespace 
 */
function constrcutorObjectProxy(vm, obj, namespace) {
    let proxyObj = {};
    // 循环data中的属性，进行代理
    for (let prop in obj) {
        // 监听proxyObj中属性的变化，但是属性是obj也就是data中的prop
        // 这里完了就可以监听test._data这个对象的改变了
        // 但是我们想监听test.content的变化
        Object.defineProperty(proxyObj, prop, {
            configurable: true,
            get() {
                return obj[prop];
            },
            set(val) {
                // 数据改变
                // 这里可以做更新页面数据
                console.log('修改的属性',getNameSpace(namespace,prop));
                obj[prop] = val;
            }
        });
        // 给vm代理，监听改变，然后可以直接test.content来访问
        Object.defineProperty(vm, prop, {
            configurable: true,
            get() {
                return obj[prop];
            },
            set(val) {
                console.log('修改的属性',getNameSpace(namespace,prop));
                obj[prop] = val;
            }
        });

        /**
         * data:{
         *      content:"",
         *      obj:{
         *              x:""
         *          }
         * }
         * 处理obj是对象的情况 递归
         */
        if (obj[prop] instanceof Object) {
            proxyObj[prop] = constrcutorProxy(vm, obj[prop], getNameSpace(namespace, prop));
        }
    }

    return proxyObj;
}


/**
 * 代理
 * @param {*} vm 给哪个模版进行代理
 * @param {*} obj  哪个对象代理
 * @param {*} namespace 命名空间
 */
export function constrcutorProxy(vm, obj, namespace) {
    let proxy = null;
    // 给数组代理
    if (obj instanceof Array) {

        // 给对象代理
    } else if (obj instanceof Object) {
        proxy = constrcutorObjectProxy(vm, obj, namespace);

    } else {
        throw new Error('obj is not Array or Object');
    }
    return proxy;
}

function getNameSpace(nowNamespace,nowProp){
    if(nowNamespace === null || nowNamespace === ''){
        return nowProp;
    } else if(nowProp === null || nowProp === ''){
        return nowNamespace;
    }else {
        return nowNamespace + '.' + nowProp;
    }
}